import store from '@/store'
import axios from 'axios'
import router from '@/router'
import { Message } from 'element-ui'

// 创建一个自定的axios方法
// axios函数请求的url地址前面会被拼接基地址，然后axios请求baseURL+url后台完整地址

export const baseURL = 'http://127.0.0.1:3007'
const myAxios = axios.create({
  baseURL
})

// 白名单: 不需要携带token的api地址
const whiteAPIList = ['/api/reg', '/api/login']

// 定义请求拦截器
myAxios.interceptors.request.use(function (config) {
  if (!whiteAPIList.includes(config.url)) {
    // 为请求头挂载 Authorization 字段
    config.headers.Authorization = store.state.token
  }
  return config
}, function (error) {
  return Promise.reject(error)
})

// 定义响应拦截器
myAxios.interceptors.response.use(function (response) {
  // 响应http状态码为2xx或3xx时触发成功的回调 形参中response是成功的结果
  // return到axios原地Promise对象 作为成功的结果
  return response
}, function (error) {
  // 响应状态码是4xx 5xx时触发失败的回调 形参中的error是失败的结果
  // retuen到axios原地Promise对象位置 作为失败拒绝的状态
  if (error.response.code === 401) {
    // 本次响应是token过期了
    // 清除vuex里一切 然后切换回到登录页面（被动退出登录状态）
    store.commit('updateToken', '')
    store.commit('updateUserInfo', {})
    router.push('/login')
    Message.error('用户身份已过期，请重新登陆！')
  }
  return Promise.reject(error)
})

// 导出自定义的axios方法，供外面调用传参发请求
export default myAxios
